package com.trgis.yhmap.util.wmtsproxy.filter;


import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * @author wangfy
 */
public class IP {
    /**
     *
     */
    private String ip;

    /**
     * 用来统计该ip访问次数
     */
    private long count = 1;

    /**
     * 用于规则计算的开始时间
     */
    private Date startTime;

    /**
     * 第一次开始记录时的时间
     */
    private Date initTime;

    /**
     * 记录一段时间内的访问时间点
     */
    private List<Date> times = new ArrayList<>();

    protected IP(String ip){
        this.ip = ip;
        this.startTime = new Date();
        initTime = startTime;
        this.times.add(startTime);
    }

    public long getCount() {
        return count;
    }

    public Date getInitTime() {
        return initTime;
    }

    public Date getStartTime(){
        return startTime;
    }

    /**
     * 获取时间段内访问次数
     * @return
     */
    public int getTimes(){
        return this.times.size();
    }

    /**
     * 判断是否超过时间段，没有则返回true
     * @param len 秒
     * @return 在给定的时间段内则返回true
     */
    public boolean isNotOvertime(int len){
        return (new Date().getTime() - startTime.getTime()) < len * 1000;
    }

    public void addOne(){
        times.add(new Date());
        count++;
    }

    /**
     * 重新计算时间段开始时间
     */
    public void removeStartTime(int len){
        Date nowTime = new Date();
        Date newStartTime = new Date(nowTime.getTime() + len * 1000);
        for(Iterator<Date> iter = times.iterator(); iter.hasNext();){
            Date d = iter.next();
            if (d.before(newStartTime)){
                iter.remove();
            } else {
                break;
            }
        }
        count++;
        times.add(nowTime);
        startTime = times.get(0);
    }

    public Date getLastTime(){
        return times.get(times.size() - 1);
    }

    public String getIp(){
        return ip;
    }

    public void initCountAndTime(){
        count = 0;
        initTime = new Date();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof IP){
            return ip.equalsIgnoreCase(((IP) obj).ip);
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return ip.hashCode();
    }
}
